import 'package:path_provider/path_provider.dart';

import '../objectbox.g.dart';

/// ObjectBox 数据库服务（核心管理类）
class ObjectBoxService {
  // 单例实例
  static ObjectBoxService? _instance;

  // 数据库存储对象
  late final Store _store;

  // 实体盒子缓存（Key: 实体类型, Value: Box实例）
  final Map<Type, dynamic> _boxCache = {};

  /// 私有构造函数
  ObjectBoxService._(this._store);

  /// 获取单例实例（异步初始化）
  static Future<ObjectBoxService> getInstance() async {
    if (_instance == null) {
      final dir = await getApplicationDocumentsDirectory();
      final store = await openStore(
        directory: '${dir.path}/objectbox',
        maxDBSizeInKB: 1024 * 1024, // 1GB 存储限制
      );
      _instance = ObjectBoxService._(store);
    }
    return _instance!;
  }

  /// 获取实体对应的 Box（泛型方法）
  Box<T> box<T>() {
    final type = T;
    if (!_boxCache.containsKey(type)) {
      _boxCache[type] = _store.box<T>();
    }
    return _boxCache[type] as Box<T>;
  }

  /// 增/改操作（自动处理ID）
  int put<T>(T entity) => box<T>().put(entity);

  /// 批量增/改
  List<int> putMany<T>(List<T> entities) => box<T>().putMany(entities);

  /// 删除操作
  bool remove<T>(int id) => box<T>().remove(id);

  /// 条件删除
  bool removeByCondition<T>(Condition<T> condition) {
    final query = box<T>().query(condition).build();
    final count = query.remove();
    query.close();
    return count > 0;
  }

  /// 查询全部
  List<T> getAll<T>() => box<T>().getAll();

  /// 条件查询构建器
  // Query<T> query<T>({Condition<T>? condition}) {
  //   final queryBuilder = box<T>().query();
  //   if (condition != null) {
  //     queryBuilder.condition(condition);
  //   }
  //   return queryBuilder.build();
  // }

  /// 执行事务
  // Future<void> runTransaction<T>(Future<void> Function() action) async {
  //   return _store.runInTransactionAsync(TxMode.write, action);
  // }

  // /// 监听数据变化（返回Stream）
  // Stream<List<T>> watch<T>({Condition<T>? condition}) {
  //   final query = this.query<T>(condition: condition);
  //   return query
  //       .watch(triggerImmediately: true)
  //       .map((query) => query.find())
  //       .doOnData((_) => query.close()); // 自动关闭查询
  // }

  /// 关闭数据库连接
  void close() {
    _store.close();
    _boxCache.clear();
    _instance = null;
  }
}
